prekreslovani bez processmessages

Otázka od: Martin Burle

16. 10. 2004 17:35

Ahoj,
v prubehu deletrvajici akce cosi vypisuji a prekresluji na formulari,
prubezne volam application.processmessages, aby se zmeny projevily. Coz
bohuzel zaroven zpusobuje, ze ovladaci prvky reaguji na pripadne akce
uzivatele, a tomu bych rad zamezil. Nevi nekdo, jak tomu jednoduse zabranit?
Zatim me napadlo jen odchycovani zprav a likvidovani tech "nepovolenych" na
urovni application.onMessage. Budu vdecny za kazdou radu, jak to udelat
jinak, popripade jak se pri prekreslovani bez processmessages obejit.

MB


Odpovedá: Petr Vones

16. 10. 2004 17:42

From: "Martin Burle" <mburle2@volny.cz>
> v prubehu deletrvajici akce cosi vypisuji a prekresluji na formulari,
> prubezne volam application.processmessages, aby se zmeny projevily. Coz
> bohuzel zaroven zpusobuje, ze ovladaci prvky reaguji na pripadne akce
> uzivatele, a tomu bych rad zamezil. Nevi nekdo, jak tomu jednoduse zabranit?

To je prave jeden z duvodu proc nikdy nevolat Application.ProcessMessages

Korektni reseni jsou vicemene dve, kde to prvni neni uplne idealni:

1. volat metodu Update formulare nebo daneho prvku (tim se sice obsah
   prekresli ale aplikace bude stale "mrtva")
2. deletrvajici akci provadet v samostatnem threadu

Petr Vones


Odpovedá: Jiri Cincura

16. 10. 2004 18:23

Martin Burle wrote:
> Ahoj,
> v prubehu deletrvajici akce cosi vypisuji a prekresluji na formulari,
> prubezne volam application.processmessages, aby se zmeny projevily. Coz
> bohuzel zaroven zpusobuje, ze ovladaci prvky reaguji na pripadne akce
> uzivatele, a tomu bych rad zamezil. Nevi nekdo, jak tomu jednoduse
> zabranit? Zatim me napadlo jen odchycovani zprav a likvidovani tech
> "nepovolenych" na urovni application.onMessage. Budu vdecny za kazdou
> radu, jak to udelat jinak, popripade jak se pri prekreslovani bez
> processmessages obejit.

1. Udelat na to vlastni thread!

2. Kdyz uz, tak uz. Disabluj vsechno co jde.

--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; mailto:xcincura@informatics.muni.cz
ICQ: 314711544
web: http://www.cincura.net; http://photo.cincura.net
---
Nekdo vidi veci, ktere existuji, a pta se - proc?. Ja snim o vecech, ktere
nikdy neexistovaly a ptam se - proc ne? (Robert Kennedy)



Odpovedá: Martin Burle

16. 10. 2004 18:00

> 1. volat metodu Update formulare nebo daneho prvku (tim se sice obsah
> prekresli ale aplikace bude stale "mrtva")

Diky, uz vim kde jsem delal chybu - vytvarim totiz formular s nejakym
panelem, pak tomu panelu zmenim parenta, takze se mi ten panel zobrazi na
jinem formulari. Nedoslo mi, ze nemohu volat update na ten neviditelny form,
ale na form ktery je ted parent, resp. primo na panel.

MB


Odpovedá: Petr Zahradnik

16. 10. 2004 22:51

Puvodni zprava ze dne 16.10.2004:

> Jinak je pravda, ze pri rekurzivnim volani ProcessMessages je
> potreba uvedomovat si mozne dusledky. Ale preneseni cinnosti do
> zvlast threadu casto zpusobi daleko vetsi problemy, zejmena kvuli
> synchronizaci se muze program zakomplikovat na neunosnou miru.

Proc ??? Kvuli trivialni synchronizaci si pridelas starosti s
ProcessMessages a budes radeji rozdelovat deletrvajici operaci na
kousky, aby to nezatuhavalo?

Petr Zahradnik, pocitacovy expert

==========================================================
Petr Zahradnik, Computer Laboratory
Obvodova 740/14, 400 07 Usti nad Labem
telefon: 475 501 627, mobil: 602 409 601, fax: 475 511 338
web: http://www.clexpert.cz, e-mail: clexpert@clexpert.cz
ICQ: 21215917, MSN: clexpert@clexpert.cz
==========================================================


Odpovedá: Jan Novak

18. 10. 2004 14:21

>> Ale preneseni cinnosti do
>> zvlast threadu casto zpusobi daleko vetsi problemy, zejmena kvuli
>> synchronizaci se muze program zakomplikovat na neunosnou miru.

> Proc ??? Kvuli trivialni synchronizaci si pridelas starosti s
> ProcessMessages a budes radeji rozdelovat deletrvajici operaci na
> kousky, aby to nezatuhavalo?

Delej, jak myslis. Ale pro mne je vyhodnejsi vlozit jedno volani
ProcessMessages nez odvozovat novout tridu od TThread, definovat
metodu Run a spekulovat, jak bych bezpecne pres Synchronize volal
metody nekolika obrazovych objektu...

To se pak text programu rozroste tak, ze puvodni myslenka se v nem
uplne ztrati. A to vsechno jen kvuli tomu, ze VCL ma nedoresene
prekreslovani, ze ho dela v 'hlavnim' treadu.

Jeste nikdy jsem s ProcessMessages nemel zadne problemy, jak tu
nekteri o nich syckuji.


Odpovedá: Jiri Cincura

18. 10. 2004 15:08

Jan Novak wrote:
> Jeste nikdy jsem s ProcessMessages nemel zadne problemy, jak tu nekteri o
> nich syckuji.

Jasne. Ja taky ne. Pouzivam to taky. Jinak by to tam asi ani nebylo. Ale je
nutne uvedomit si, na co si musim dat pri pouzivani pozor (stejne jako ne ke
vsemu musis z threadu pristupovat pres Synchronize, chce to jen myslet).

Ale pokud to na to jde, radsi jdu do threadu, pozdeji se to vyplati. Je
pravda, ze ze zacatku to chce laborovat, ale kdyz uz mas pekne promenne v
threadu, mas takovy lepsi (citelnejsi, efektivnejsi, ...) kod.

BTW ta metoda je Execute  

--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; mailto:xcincura@informatics.muni.cz
ICQ: 314711544
web:
  http://www.cincura.net/
  http://phorum.cincura.net/
  http://photo.cincura.net/
---
Nekdo vidi veci, ktere existuji, a pta se - proc?. Ja snim o vecech, ktere
nikdy neexistovaly a ptam se - proc ne? (Robert Kennedy)



Odpovedá: Petr Vones

18. 10. 2004 15:46

From: "Jan Novak" <delfin4@volny.cz>
> Delej, jak myslis. Ale pro mne je vyhodnejsi vlozit jedno volani
> ProcessMessages nez odvozovat novout tridu od TThread, definovat
> metodu Run a spekulovat, jak bych bezpecne pres Synchronize volal
> metody nekolika obrazovych objektu...

Neni treba spekulovat, to ma pomerne jasna pravidla.

> To se pak text programu rozroste tak, ze puvodni myslenka se v nem
> uplne ztrati. A to vsechno jen kvuli tomu, ze VCL ma nedoresene

To vubec ne, mozna v pripade ze je to spatne navrzene uz od zacatku.

> prekreslovani, ze ho dela v 'hlavnim' treadu.

Ne, to je proto, ze si opominul zakladni principy fungovani Win32. To neni
problem VCL.

Petr Vones


Odpovedá: Jan Novak

18. 10. 2004 19:34

> BTW ta metoda je Execute  

no jo. Mesic jsem nesahnul na Delphi, delam ted zakazku na linuxu v C
s knihovnou Qt od Trolltechu a v QThread je to run(). I to 'begin' se
tam pise jako '{'...


Odpovedá: Jan Novak

18. 10. 2004 19:56

>> A to vsechno jen kvuli tomu, ze VCL ma nedoresene

> To vubec ne

Ja bych treba hlavni smycku obsluhy fronty zprav resil tak, ze bych
mel vytvorenych nekolik (3-10?) threadu a zpravu z cela fronty bych
odevzdal prvnimu nebezicimu treadu. Mozna bych jeden z tech threadu
mel rezervovany jen pro urcitou mnozinu zprav typu WM_QUIT atd.

Jenze to by nejdriv cela VCL musela byt thread-safe. A nejen ta,
kuprikladu databazovi klienti, atd..


Odpovedá: Jiri Cincura

18. 10. 2004 20:08

Jan Novak wrote:
>
> Ja bych treba hlavni smycku obsluhy fronty zprav resil tak, ze bych mel
> vytvorenych nekolik (3-10?) threadu a zpravu z cela fronty bych odevzdal
> prvnimu nebezicimu treadu. Mozna bych jeden z tech threadu mel
> rezervovany jen pro urcitou mnozinu zprav typu WM_QUIT atd.

Tak tohle bych chtel videt v akci.

> Jenze to by nejdriv cela VCL musela byt thread-safe. A nejen ta,
> kuprikladu databazovi klienti, atd..

Hmmm, zajimavy napad.

--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; mailto:xcincura@informatics.muni.cz
ICQ: 314711544
web:
  http://www.cincura.net/
  http://photo.cincura.net/
  http://phorum.cincura.net/
---
A i kdyz je nase doba obtizna a zmatena, je podnetna a vyplnena
prilezitostmi. And if our times are difficult and perplexing, so are they
challenging and filled with opportunity. -Robert F. Kennedy, 1961